package network;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

// 定义UdpEchoClient类，这个类实现了一个UDP客户端，用于发送数据到服务器，并接收服务器回显的数据。
public class UdpEchoClient {
    // 私有成员变量socket用于UDP通信。
    private DatagramSocket socket = null;
    // serverIp存储服务器的IP地址。
    private String serverIp;
    // serverPort存储服务器监听的端口号。
    private int serverPort;

    // UdpEchoClient的构造函数，接受服务器的IP地址和端口号作为参数。
    public UdpEchoClient (String serverIp, int serverPort) throws SocketException {
        // 初始化服务器IP地址和端口号。
        this.serverIp = serverIp;
        this.serverPort = serverPort;
        // 创建DatagramSocket实例。在客户端，通常不需要手动绑定特定端口，可以让操作系统随机分配一个空闲端口。
        // 这是因为客户端通常不需要在一个固定端口监听，而是主动向服务器发送请求。
        socket = new DatagramSocket();
    }

    // start方法用于启动客户端程序。
    public void start() throws IOException {
        System.out.println("客户端,启动!");
        Scanner scanner=new Scanner(System.in);
        // 循环，持续从用户接收输入，发送到服务器，并接收服务器的响应。
        while(true){
            // 1.从控制台读取用户希望发送到服务器的数据.
            if(!scanner.hasNext()){
                break;
            }
            String request = scanner.next();
            // 2.构造请求并发送
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),
                    request.getBytes().length, InetAddress.getByName(serverIp),serverPort);
            socket.send(requestPacket);
            // 3.构建另一个用于接收的空的UDP数据包，然后通过socket接收服务器的响应数据包。
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            // 4.解析响应数据包，提取数据，并显示在控制台上.
            String response=new String(responsePacket.getData(),0,responsePacket.getLength());
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient client = new UdpEchoClient("127.0.0.1",6666);
        client.start();
    }

}


